/**
 * @package 两数之和
 * @description
 * 给定一个整数数组 nums 和一个整数目标值 target,
 * 请你在该数组中找出 和为目标值 target  的那 两个 整数，并返回它们的数组下标。
 * 你可以假设每种输入只会对应一个答案。
 * 但是，数组中同一个元素在答案里不能重复出现。
 * 你可以按任意顺序返回答案。
 * @author liu
 */
export const title = '两数之和'

/**
 * 暴力解法
 * @param {number[]} nums
 * @param {number} target
 * @returns {number[]}
 */
export function twoSum(nums: number[], target: number): number[] {
  const len = nums.length
  for (let i = 0; i < len; i++) {
    for (let j = i + 1; j < len; j++) {
      if (nums[i] + nums[j] === target) {
        return [i, j]
      }
    }
  }
  return []
}

/**
 * 哈希解法
 * @param {number[]} nums
 * @param {number} target
 * @returns {number[]}
 */
export function twoSumMap(nums: number[], target: number): number[] {
  const map = new Map()
  const len = nums.length
  for (let i = 0; i < len; i++) {
    const num = target - nums[i]
    if (map.has(num)) {
      return [map.get(num), i]
    }
    map.set(nums[i], i)
  }
  return []
}
